home *** CD-ROM | disk | FTP | other *** search
/ Hobby PC 12 / Hobby PC 12.iso / assets / Asset Library / Forms / valid.js < prev    next >
Text File  |  2001-04-09  |  27KB  |  821 lines

  1. var defaultEmptyOK = false;
  2.  
  3. //set up basic character groups
  4. var digits = "0123456789";
  5. var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
  6. var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  7. var whitespace = " \t\n\r";
  8. var nameDelimiters = "-. ";
  9. var decimalPointDelimiter = ".";
  10. var daysInMonth = makeArrayFromString(31,29,31,30,31,30,31,31,30,31,30,31);
  11.  
  12. //set up allowed characters for specific data types
  13.  
  14. //phone numbers
  15. var phoneNumberDelimiters = "()- ";
  16. var digitsInUSPhoneNumber = 10;
  17. var validUSPhoneChars = digits + phoneNumberDelimiters;
  18. var validWorldPhoneChars = digits + phoneNumberDelimiters + "+";
  19.  
  20. //electronic addresses
  21. var validDomainNameChars = digits + uppercaseLetters + lowercaseLetters + "-_.";
  22.  
  23. //snail mail addresses
  24. var addressDelimiters = ".,/-" + whitespace;
  25. var validAddressCharacters = addressDelimiters + digits + uppercaseLetters + lowercaseLetters;
  26.  
  27. //US mail address parameters
  28. var digitsInZIPCode1 = 5;
  29. var digitsInZIPCode2 = 9;
  30. var ZIPCodeDelimiters = "-";
  31. var ZIPCodeDelimeter = "-";
  32. var validZIPCodeChars = digits + ZIPCodeDelimiters;
  33. var USStateCodes = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP";
  34. var USStateCodeDelimiter = "|";
  35.  
  36. //Canadian mail address parameters
  37. var cdnProvCodes = "BC|AB|SK|MB|ON|QC|NF|PE|NS|NB|NT|YT|NU";
  38. var postalCodeDelimiter = " ";
  39. var validPostalCodeChars = digits + lowercaseLetters + uppercaseLetters + postalCodeDelimiter;
  40. var charsInPostalCode = 6;
  41. var cdnProvCodeDelimiter = "|";
  42.  
  43. //credit card parameters
  44. var creditCardDelimiters = " ";
  45.  
  46. function makeArray(n) {
  47.    for (var i = 1; i <= n; i++) {
  48.       this[i] = 0;
  49.    } 
  50.    this[length] = n;
  51.    return this;
  52. }
  53.  
  54. function makeArrayFromString() {
  55.    for (var i = 1; i <= makeArrayFromString.arguments.length; i++){
  56.       this[i] = makeArrayFromString.arguments[i];
  57.    }
  58.    this[length] = makeArrayFromString.arguments.length;
  59.    return this;
  60. }
  61.  
  62. function isEmpty(s) {
  63.     return ((s == null) || (s.length == 0))
  64. }
  65.  
  66. function isWhitespace(s) {
  67.     var i;
  68.  
  69.     if (isEmpty(s)) return true;
  70.     for (i = 0; i < s.length; i++)
  71.     {   
  72.         var c = s.charAt(i);
  73.         if (whitespace.indexOf(c) == -1) return false; // not whitespace
  74.     }
  75.     return true;
  76. }
  77.  
  78. function stripCharsInBag (s, bag){
  79.     var i;
  80.     var returnString = "";
  81.     for (i = 0; i < s.length; i++)
  82.     {   
  83.         // Check that current character isn't whitespace.
  84.         var c = s.charAt(i);
  85.         if (bag.indexOf(c) == -1) returnString += c;
  86.     }
  87.     return returnString;
  88. }
  89.  
  90. function stripCharsNotInBag (s, bag){
  91.     var i;
  92.     var returnString = "";
  93.     for (i = 0; i < s.length; i++)
  94.     {   
  95.         var c = s.charAt(i);
  96.         if (bag.indexOf(c) != -1) returnString += c;
  97.     }
  98.     return returnString;
  99. }
  100.  
  101. function stripWhitespace (s){
  102.    return stripCharsInBag (s, whitespace)
  103. }
  104.  
  105. function charInString (c, s){
  106.     for (i = 0; i < s.length; i++){
  107.        if (s.charAt(i) == c) return true;
  108.     }
  109.     return false
  110. }
  111.  
  112. function stripInitialWhitespace (s){
  113.     var i = 0;
  114.     while ((i < s.length) && charInString (s.charAt(i), whitespace))
  115.        i++;
  116.     return s.substring (i, s.length);
  117. }
  118.  
  119. function isLetter (c){
  120.    return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
  121. }
  122.  
  123. function isDigit (c){
  124.    return ((c >= "0") && (c <= "9"))
  125. }
  126.  
  127. function isLetterOrDigit (c){
  128.    return (isLetter(c) || isDigit(c))
  129. }
  130.  
  131. function isInteger (s){
  132.     var i;
  133.     if (isEmpty(s)) 
  134.        if (isInteger.arguments.length == 1) return defaultEmptyOK;
  135.        else return (isInteger.arguments[1] == true);
  136.     for (i = 0; i < s.length; i++)
  137.     {   
  138.         var c = s.charAt(i);
  139.         if (!isDigit(c)) return false;
  140.     }
  141.     return true;
  142. }
  143.  
  144. function isSignedInteger (s){
  145.    if (isEmpty(s)) 
  146.        if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
  147.        else return (isSignedInteger.arguments[1] == true);
  148.     else {
  149.         var startPos = 0;
  150.         var secondArg = defaultEmptyOK;
  151.         if (isSignedInteger.arguments.length > 1)
  152.             secondArg = isSignedInteger.arguments[1];
  153.         if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
  154.            startPos = 1;    
  155.         return (isInteger(s.substring(startPos, s.length), secondArg))
  156.     }
  157. }
  158.  
  159. function isPositiveInteger (s){
  160.     var secondArg = defaultEmptyOK;
  161.     if (isPositiveInteger.arguments.length > 1)
  162.         secondArg = isPositiveInteger.arguments[1];
  163.     return (isSignedInteger(s, secondArg)
  164.          && ( (isEmpty(s) && secondArg)  || (parseInt (s) > 0) ) );
  165. }
  166.  
  167. function isNonnegativeInteger (s){
  168.     var secondArg = defaultEmptyOK;
  169.     if (isNonnegativeInteger.arguments.length > 1)
  170.         secondArg = isNonnegativeInteger.arguments[1];
  171.     return (isSignedInteger(s, secondArg)
  172.          && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
  173. }
  174.  
  175. function isNegativeInteger (s){
  176.     var secondArg = defaultEmptyOK;
  177.     if (isNegativeInteger.arguments.length > 1)
  178.         secondArg = isNegativeInteger.arguments[1];
  179.     return (isSignedInteger(s, secondArg)
  180.          && ( (isEmpty(s) && secondArg)  || (parseInt (s) < 0) ) );
  181. }
  182.  
  183. function isNonpositiveInteger (s){
  184.     var secondArg = defaultEmptyOK;
  185.     if (isNonpositiveInteger.arguments.length > 1)
  186.         secondArg = isNonpositiveInteger.arguments[1];
  187.     return (isSignedInteger(s, secondArg)
  188.          && ( (isEmpty(s) && secondArg)  || (parseInt (s) <= 0) ) );
  189. }
  190.  
  191. function isFloat (s){
  192.     var i;
  193.     var seenDecimalPoint = false;
  194.     if (isEmpty(s)) 
  195.        if (isFloat.arguments.length == 1) return defaultEmptyOK;
  196.        else return (isFloat.arguments[1] == true);
  197.     if (s == decimalPointDelimiter) return false;
  198.     for (i = 0; i < s.length; i++)
  199.     {   
  200.         var c = s.charAt(i);
  201.         if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
  202.         else if (!isDigit(c)) return false;
  203.     }
  204.     return true;
  205. }
  206.  
  207. function isSignedFloat (s){
  208.     if (isEmpty(s)) 
  209.        if (isSignedFloat.arguments.length == 1) return defaultEmptyOK;
  210.        else return (isSignedFloat.arguments[1] == true);
  211.     else {
  212.         var startPos = 0;
  213.         var secondArg = defaultEmptyOK;
  214.         if (isSignedFloat.arguments.length > 1)
  215.             secondArg = isSignedFloat.arguments[1];
  216.         if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
  217.            startPos = 1;    
  218.         return (isFloat(s.substring(startPos, s.length), secondArg))
  219.     }
  220. }
  221.  
  222. function isAlphabetic (s){
  223.     var i;
  224.     if (isEmpty(s)) 
  225.        if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
  226.        else return (isAlphabetic.arguments[1] == true);
  227.     for (i = 0; i < s.length; i++)
  228.     {   
  229.         var c = s.charAt(i);
  230.         if (!isLetter(c))
  231.         return false;
  232.     }
  233.     return true;
  234. }
  235.  
  236. function isAlphanumeric (s){
  237.     var i;
  238.     if (isEmpty(s)) 
  239.        if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
  240.        else return (isAlphanumeric.arguments[1] == true);
  241.     for (i = 0; i < s.length; i++)
  242.     {   
  243.         var c = s.charAt(i);
  244.         if (! (isLetter(c) || isDigit(c) ) )
  245.         return false;
  246.     }
  247.     return true;
  248. }
  249.  
  250. function reformat (s){
  251.     var arg;
  252.     var sPos = 0;
  253.     var resultString = "";
  254.     for (var i = 1; i < reformat.arguments.length; i++) {
  255.        arg = reformat.arguments[i];
  256.        if (i % 2 == 1) resultString += arg;
  257.        else {
  258.            resultString += s.substring(sPos, sPos + arg);
  259.            sPos += arg;
  260.        }
  261.     }
  262.     return resultString;
  263. }
  264.  
  265. function reformatWebURL(s) {
  266.   if (isEmpty(s)) 
  267.      if (reformatWebURL.arguments.length == 1) return defaultEmptyOK;
  268.      else return (reformatWebURL.arguments[1] == true);
  269.   return ("http://"+s);
  270. }
  271.  
  272. function makeTitleCase(s){
  273.   if (isEmpty(s)) 
  274.      if (makeTitleCase.arguments.length == 1) return defaultEmptyOK;
  275.      else return (makeTitleCase.arguments[1] == true);
  276.   count = 1;
  277.   ws = 0;
  278.   s = s.charAt(0).toUpperCase()+s.substring(1,s.length);
  279.   while (count < s.length){
  280.     if (isWhitespace(s.charAt(count)) || (s.charAt(count) == ".") || (s.charAt(count) == "-")) ws = 1;
  281.     else if ((ws == 1) && (isLetter(s.charAt(count)))){
  282.       s = s.substring(0,count)+s.charAt(count).toUpperCase()+s.substring(count+1,s.length);
  283.       ws = 0;
  284.     }
  285.     count++;
  286.   }
  287.   return s;
  288. }
  289.  
  290. function isUSPhoneNumber (s){
  291.     if (isEmpty(s)) 
  292.        if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
  293.        else return (isUSPhoneNumber.arguments[1] == true);
  294.     return (isInteger(s) && s.length == digitsInUSPhoneNumber)
  295. }
  296.  
  297. function isInternationalPhoneNumber (s){
  298.     if (isEmpty(s)) {
  299.        if (isInternationalPhoneNumber.arguments.length == 1) return defaultEmptyOK;
  300.        else return (isInternationalPhoneNumber.arguments[1] == true);
  301.     }
  302.     return isPositiveInteger(s);
  303. }
  304.  
  305. function isZIPCode (s){
  306.    if (isEmpty(s)) 
  307.        if (isZIPCode.arguments.length == 1) return defaultEmptyOK;
  308.        else return (isZIPCode.arguments[1] == true);
  309.    return (isInteger(s) && 
  310.             ((s.length == digitsInZIPCode1) ||
  311.              (s.length == digitsInZIPCode2)))
  312. }
  313.  
  314. function isPostalCode (s){
  315.    if (isEmpty(s)){
  316.        if (isPostalCode.arguments.length == 1) return defaultEmptyOK;
  317.        else return (isPostalCode.arguments[1] == true);
  318.    }
  319.    if (!isAlphanumeric(s)) return false;
  320.    if (s.length == charsInPostalCode){
  321.      var count = 0;
  322.      var status = "";
  323.      while (count < s.length){
  324.        if ((parseFloat(count%2)) == 0) status = isLetter(s.charAt(count));
  325.        else status = isDigit(s.charAt(count));     
  326.        if (status == false) return status
  327.        count++;
  328.      }
  329.    return status;
  330.    }
  331.    else return false;
  332. }
  333.  
  334. function isStateCode(s){
  335.     if (isEmpty(s)) 
  336.        if (isStateCode.arguments.length == 1) return defaultEmptyOK;
  337.        else return (isStateCode.arguments[1] == true);
  338.     return ( (USStateCodes.indexOf(s) != -1) &&
  339.              (s.indexOf(USStateCodeDelimiter) == -1) )
  340. }
  341.  
  342. function isProvinceCode(s) {
  343.     if (isEmpty(s))
  344.         if (isProvinceCode.arguments.length == 1) return defaultEmptyOK;
  345.         else return (isProvinceCode.arguments[1] == true);
  346.     return( (cdnProvCodes.indexOf(s) != -1) &&
  347.             (s.indexOf(cdnProvCodeDelimiter) == -1)  )
  348. }
  349.  
  350. function isEmail (s){
  351.     if (isEmpty(s)) {
  352.        if (isEmail.arguments.length == 1) return defaultEmptyOK;
  353.        else return (isEmail.arguments[1] == true); }
  354.     if (isWhitespace(s)) return false;
  355.     var i = 1;
  356.     var sLength = s.length;
  357.     while ((i < sLength) && (s.charAt(i) != "@"))
  358.     { i++ }
  359.     if ((i >= sLength) || (s.charAt(i) != "@")) return ("no @ sign");
  360.     else atloc = i;
  361.     j = i+1;
  362.     i += 1;
  363.     while ((j < sLength) && (validDomainNameChars.indexOf(s.charAt(j)) != -1))
  364.     { j++ }
  365.     if (j < sLength) return("invalid character in domain name: "+s.charAt(j));
  366.     while ((i < sLength) && (s.charAt(i) != "."))
  367.     { i++ }
  368.     if (i == sLength) return("no . in domain name");
  369.     if (i == (atloc +1)) return("not enough space between @ and .");
  370.     k = atloc+1;
  371.     while (k < sLength){
  372.       if ((s.charAt(k) == ".") && (s.charAt(k+1) == ".")) return("too many .'s");
  373.       k++
  374.     }
  375.     l = sLength;
  376.     while ((i < sLength -2) && (l != i) && (s.charAt(l) != "."))
  377.     { l = l-1 }
  378.     if ((i >= sLength - 2) || (s.charAt(i) != ".") || (l >= sLength - 2)) return("not enough chars after .");
  379.     else return true;
  380. }
  381.  
  382. function isURL (s)
  383. {   if (isEmpty(s)) 
  384.        if (isURL.arguments.length == 1) return defaultEmptyOK;
  385.        else return (isURL.arguments[1] == true);
  386.     if (isWhitespace(s)) return false;
  387.     var i = 0;
  388.     var j = 0;
  389.     var URLstart = 0;
  390.     var sLength = s.length;
  391.     while ((j < sLength) && (validDomainNameChars.indexOf(s.charAt(j)) != -1))
  392.     { j++ }
  393.     if (j < sLength) return("invalid character in domain name: "+s.charAt(j));
  394.     while ((i < sLength) && (s.charAt(i) != "."))
  395.     { i++ }
  396.     if (i == sLength) return("no . in domain name");
  397.     if (i == (URLstart)) return("not enough space before first .");
  398.     k = URLstart+1;
  399.     while (k < sLength)
  400.     {
  401.       if ((s.charAt(k) == ".") && (s.charAt(k+1) == ".")) return("too many .'s");
  402.       k++
  403.     }
  404.     l = sLength;
  405.     while ((i < sLength -2) && (l != i) && (s.charAt(l) != "."))
  406.     { l = l-1 }
  407.     if ((i >= sLength - 2) || (s.charAt(i) != ".") || (l >= sLength - 2)) return("not enough chars after .");
  408.     else return true;
  409. }
  410.  
  411. function isYear (s){
  412.     if (isEmpty(s)) 
  413.        if (isYear.arguments.length == 1) return defaultEmptyOK;
  414.        else return (isYear.arguments[1] == true);
  415.     if (!isNonnegativeInteger(s)) return false;
  416.     else return ((s.length == 4) || (s.length == 2));
  417. }
  418.  
  419. function isIntegerInRange (s, a, b){
  420.     if (isEmpty(s)) 
  421.        if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
  422.        else return (isIntegerInRange.arguments[1] == true);
  423.     if (!isInteger(s, false)) return false;
  424.     var num = parseInt (s);
  425.     return ((num >= a) && (num <= b));
  426. }
  427.  
  428. function isMonth (s){
  429.     if (isEmpty(s)) 
  430.        if (isMonth.arguments.length == 1) return defaultEmptyOK;
  431.        else return (isMonth.arguments[1] == true);
  432.     return isIntegerInRange (s, 1, 12);
  433. }
  434.  
  435. function isDay (s){
  436.     if (isEmpty(s)) 
  437.        if (isDay.arguments.length == 1) return defaultEmptyOK;
  438.        else return (isDay.arguments[1] == true);   
  439.     return isIntegerInRange (s, 1, 31);
  440. }
  441.  
  442. function daysInFebruary (year){
  443.     return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
  444. }
  445.  
  446. function isDate (year, month, day){ 
  447.     if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;
  448.     var intYear = parseInt(year);
  449.     var intMonth = parseInt(month);
  450.     var intDay = parseInt(day);
  451.     if (intDay > daysInMonth[intMonth]) return false; 
  452.     if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;
  453.     return true;
  454. }
  455.  
  456. function prompt (s){
  457.     window.status = s
  458. }
  459.  
  460. function warnInvalid (theField,s){
  461. //    theField.focus()
  462.     theField.select()
  463.     alert(s)
  464.     return false
  465. }
  466.  
  467. function checkString (theField, s, emptyOK){
  468.     if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
  469.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  470.     if (isWhitespace(theField.value)) 
  471.        return warnEmpty (theField, s);
  472.     else return true;
  473. }
  474.  
  475. function checkStateCode (theField, emptyOK){
  476.     if (checkStateCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  477.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  478.     else
  479.     {  theField.value = theField.value.toUpperCase();
  480.        if (!isStateCode(theField.value, false)) 
  481.           return warnInvalid (theField, "Invalid State Code");
  482.        else return true;
  483.     }
  484. }
  485.  
  486. function checkProvinceCode (theField, emptyOK)
  487. {   if (checkProvinceCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  488.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  489.     else
  490.     {  theField.value = theField.value.toUpperCase();
  491.        if (!isProvinceCode(theField.value, false)) 
  492.           return warnInvalid (theField, "Invalid Province Code");
  493.        else return true;
  494.     }
  495. }
  496.  
  497. function reformatZIPCode (ZIPString){
  498.     if (ZIPString.length == 5) return ZIPString;
  499.     else return (reformat (ZIPString, "", 5, "-", 4));
  500. }
  501.  
  502. function checkZIPCode (theField, emptyOK){
  503.     if (checkZIPCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  504.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  505.     else
  506.     { var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
  507.       if (!isZIPCode(normalizedZIP, false)) 
  508.          return warnInvalid (theField, "Invalid Zip Code");
  509.       else 
  510.       {
  511.          theField.value = reformatZIPCode(normalizedZIP)
  512.          return true;
  513.       }
  514.     }
  515. }
  516.  
  517. function checkPostalCode (theField, emptyOK){
  518.     if (checkPostalCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  519.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  520.     else{
  521.       var normalizedPostalCode = stripCharsInBag(theField.value, postalCodeDelimiter)
  522.       if (!isPostalCode(normalizedPostalCode, false)) 
  523.          return warnInvalid (theField, "Invalid Postal Code");
  524.       else {
  525.          theField.value = theField.value.toUpperCase();
  526.          theField.value = reformat(stripCharsInBag(theField.value,postalCodeDelimiter),"",3,postalCodeDelimiter,3);
  527.          return true;
  528.       }
  529.     }
  530. }
  531.  
  532. function reformatUSPhone (USPhone)
  533. {   return (reformat (USPhone, "(", 3, ") ", 3, "-", 4))
  534. }
  535.  
  536. function checkUSPhone (theField, emptyOK)
  537. {   if (checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
  538.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  539.     else
  540.     {  var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters)
  541.        if (!isUSPhoneNumber(normalizedPhone, false)) 
  542.           return warnInvalid (theField, "Invalid NA Phone Number");
  543.        else 
  544.        {
  545.           theField.value = reformatUSPhone(normalizedPhone)
  546.           return true;
  547.        }
  548.     }
  549. }
  550.  
  551. function checkInternationalPhone (theField, emptyOK)
  552. {   if (checkInternationalPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
  553.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  554.     else
  555.     {  if (!isInternationalPhoneNumber(stripCharsInBag(theField.value,phoneNumberDelimiters))) {
  556.           return warnInvalid (theField, "Invalid International Phone");
  557.        }
  558.        else return true;
  559.     }
  560. }
  561.  
  562. function checkName(theField,emptyOK){
  563.     if (checkName.arguments.length == 1) emptyOK = defaultEmptyOK;
  564.     if (isEmpty(theField.value)) return emptyOK;
  565.     else {
  566.         if (!isAlphabetic(stripCharsInBag(theField.value,nameDelimiters))){
  567.           warnInvalid(theField,theField.name+" contains invalid characters");
  568.           return false;
  569.         }
  570.         else {
  571.           theField.value = makeTitleCase(theField.value);
  572.           return true;
  573.         }
  574.     }
  575. }
  576.  
  577. function checkAddress(theField, emptyOK){
  578.     if (checkAddress.arguments.length == 1) emptyOK = defaultEmptyOK;
  579.     if (isEmpty(theField.value)) return emptyOK;
  580.     else {
  581.       if (!isEmpty(stripCharsInBag(theField.value,validAddressCharacters))) return warnInvalid(theField,theField.name+ " contains invalid characters");
  582.       else {
  583.         theField.value = makeTitleCase(theField.value);
  584.         return true
  585.       }
  586.     }
  587. }
  588.  
  589. function checkEmail (theField, emptyOK){
  590.     if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
  591.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  592.     else {
  593.       emailStatus = isEmail(theField.value, false)
  594.       if (emailStatus != true) return warnInvalid (theField, "Invalid Email Address");
  595.       else return true;
  596.     }
  597. }
  598.  
  599. function checkURL (theField, emptyOK){
  600.     if (checkURL.arguments.length == 1) emptyOK = defaultEmptyOK;
  601.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  602.     else {
  603.       var tempURL = theField.value;
  604.       if ((tempURL.indexOf("http://") >= 0) && (tempURL.indexOf("http://") < tempURL.length)) theField.value = tempURL.substring(tempURL.indexOf("http://")+7,tempURL.length);
  605.       URLStatus = isURL(theField.value, false)
  606.       if (URLStatus != true) return warnInvalid (theField, "Invalid URL");
  607.       else {
  608.         theField.value = reformatWebURL(theField.value);
  609.         return true;
  610.       }
  611.     }
  612. }
  613.  
  614. function checkYear (theField, emptyOK){
  615.     if (checkYear.arguments.length == 1) emptyOK = defaultEmptyOK;
  616.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  617.     if (!isYear(theField.value, false)) 
  618.        return warnInvalid (theField, "Invalid Year");
  619.     else {
  620.     if (theField.value.length == 2) theField.value = (parseInt(theField.value)+1900);
  621.     return true;
  622.     }
  623. }
  624.  
  625. function checkMonth (theField, emptyOK){
  626.     if (checkMonth.arguments.length == 1) emptyOK = defaultEmptyOK;
  627.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  628.     if (!isMonth(theField.value, false)) 
  629.        return warnInvalid (theField, "Invalid Month");
  630.     else return true;
  631. }
  632.  
  633. function checkDay (theField, emptyOK){
  634.     if (checkDay.arguments.length == 1) emptyOK = defaultEmptyOK;
  635.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  636.     if (!isDay(theField.value, false)) 
  637.        return warnInvalid (theField, "Invalid Day");
  638.     else return true;
  639. }
  640.  
  641. function checkDate (yearField, monthField, dayField, labelString, OKtoOmitDay){
  642.     if (checkDate.arguments.length == 4) OKtoOmitDay = false;
  643.     if (!isYear(yearField.value)) return warnInvalid (yearField, "Invalid Year");
  644.     else if (yearField.value.length == 2) yearField.value = (parseInt(yearField.value)+1900);
  645.     if (!isMonth(monthField.value)) return warnInvalid (monthField, "Invalid Month");
  646.     if ( (OKtoOmitDay == true) && isEmpty(dayField.value) ) return true;
  647.     else if (!isDay(dayField.value)) 
  648.        return warnInvalid (dayField, "Invalid Day");
  649.     if (isDate (yearField.value, monthField.value, dayField.value))
  650.        return true;
  651.     alert ("The " + labelString + " is invalid" )
  652.     return false
  653. }
  654.  
  655. function checkMDY(theField,emptyOK){
  656.     if (checkMDY.arguments.length == 1) emptyOK = defaultEmptyOK;
  657.     if (isEmpty(theField.value)) return emptyOK;
  658.     else{
  659.       var dateString = stripCharsInBag(theField.value,"-/ ");
  660.       var mm = dateString.substring(0,2);
  661.       var dd = dateString.substring(2,4);
  662.       var yyyy = dateString.substring(4,theField.value.length);
  663.       if (!isMonth(mm)) return warnInvalid(theField,theField.name + " contains an invalid month. Format must be MM/DD/YYYY.");
  664.       if (!isDay(dd)) return warnInvalid(theField,theField.name + " contains an invalid day. Format must be MM/DD/YYYY.");
  665.       if (!isYear(yyyy)) return warnInvalid(theField,theField.name + " contains an invalid year. Format must be MM/DD/YYYY.");
  666.       else if (yyyy.length == 2) yyyy = (parseInt(yyyy)+1900);
  667.       if (isDate(yyyy.toString(),mm.toString(),dd.toString())){
  668.         theField.value = mm+"/"+dd+"/"+yyyy;
  669.         return true;
  670.       }
  671.       else{
  672.         warnInvalid(theField,theField.name + " contains an invalid date");
  673.         return false;
  674.       }
  675.     }
  676. }
  677.  
  678. function getRadioButtonValue (radio){
  679.     for (var i = 0; i < radio.length; i++)
  680.     {   if (radio[i].checked) { break }
  681.     }
  682.     return radio[i].value
  683. }
  684.  
  685. function checkCreditCard (radio, theField){
  686.     var cardType = getRadioButtonValue (radio)
  687.     var normalizedCCN = stripCharsInBag(theField.value, creditCardDelimiters)
  688.     if (!isCardMatch(cardType, normalizedCCN)) 
  689.        return warnInvalid (theField, "Not a valid " + cardType + " Number");
  690.     else 
  691.     {  theField.value = normalizedCCN
  692.        return true
  693.     }
  694. }
  695.  
  696.  
  697. function isCreditCard(st) {
  698.   if (st.length > 19)
  699.     return (false);
  700.   sum = 0; mul = 1; l = st.length;
  701.   for (i = 0; i < l; i++) {
  702.     digit = st.substring(l-i-1,l-i);
  703.     tproduct = parseInt(digit ,10)*mul;
  704.     if (tproduct >= 10)
  705.       sum += (tproduct % 10) + 1;
  706.     else
  707.       sum += tproduct;
  708.     if (mul == 1)
  709.       mul++;
  710.     else
  711.       mul--;
  712.   }
  713.   if ((sum % 10) == 0)
  714.     return (true);
  715.   else
  716.     return (false);
  717. }
  718.  
  719. function isVisa(cc){
  720.   if (((cc.length == 16) || (cc.length == 13)) &&
  721.       (cc.substring(0,1) == 4))
  722.     return isCreditCard(cc);
  723.   return false;
  724. }
  725.  
  726. function isMasterCard(cc){
  727.   firstdig = cc.substring(0,1);
  728.   seconddig = cc.substring(1,2);
  729.   if ((cc.length == 16) && (firstdig == 5) &&
  730.       ((seconddig >= 1) && (seconddig <= 5)))
  731.     return isCreditCard(cc);
  732.   return false;
  733.  
  734. }
  735.  
  736. function isAmericanExpress(cc){
  737.   firstdig = cc.substring(0,1);
  738.   seconddig = cc.substring(1,2);
  739.   if ((cc.length == 15) && (firstdig == 3) &&
  740.       ((seconddig == 4) || (seconddig == 7)))
  741.     return isCreditCard(cc);
  742.   return false;
  743.  
  744. }
  745.  
  746. function isDinersClub(cc){
  747.   firstdig = cc.substring(0,1);
  748.   seconddig = cc.substring(1,2);
  749.   if ((cc.length == 14) && (firstdig == 3) &&
  750.       ((seconddig == 0) || (seconddig == 6) || (seconddig == 8)))
  751.     return isCreditCard(cc);
  752.   return false;
  753. }
  754.  
  755.  
  756. function isCarteBlanche(cc){
  757.   return isDinersClub(cc);
  758. }
  759.  
  760.  
  761. function isDiscover(cc){
  762.   first4digs = cc.substring(0,4);
  763.   if ((cc.length == 16) && (first4digs == "6011"))
  764.     return isCreditCard(cc);
  765.   return false;
  766.  
  767. }
  768.  
  769. function isEnRoute(cc){
  770.   first4digs = cc.substring(0,4);
  771.   if ((cc.length == 15) &&
  772.       ((first4digs == "2014") ||
  773.        (first4digs == "2149")))
  774.     return isCreditCard(cc);
  775.   return false;
  776. }
  777.  
  778. function isJCB(cc){
  779.   first4digs = cc.substring(0,4);
  780.   if ((cc.length == 16) &&
  781.       ((first4digs == "3088") ||
  782.        (first4digs == "3096") ||
  783.        (first4digs == "3112") ||
  784.        (first4digs == "3158") ||
  785.        (first4digs == "3337") ||
  786.        (first4digs == "3528")))
  787.     return isCreditCard(cc);
  788.   return false;
  789. }
  790.  
  791. function isAnyCard(cc){
  792.   if (!isCreditCard(cc))
  793.     return false;
  794.   if (!isMasterCard(cc) && !isVisa(cc) && !isAmericanExpress(cc) && !isDinersClub(cc) &&
  795.       !isDiscover(cc) && !isEnRoute(cc) && !isJCB(cc)) {
  796.     return false;
  797.   }
  798.   return true;
  799. }
  800.  
  801. function isCardMatch (cardType, cardNumber){
  802.     cardType = cardType.toUpperCase();
  803.     var doesMatch = true;
  804.     if ((cardType == "VISA") && (!isVisa(cardNumber)))
  805.         doesMatch = false;
  806.     if ((cardType == "MASTERCARD") && (!isMasterCard(cardNumber)))
  807.         doesMatch = false;
  808.     if ( ( (cardType == "AMERICANEXPRESS") || (cardType == "AMEX") )
  809.                 && (!isAmericanExpress(cardNumber))) doesMatch = false;
  810.     if ((cardType == "DISCOVER") && (!isDiscover(cardNumber)))
  811.         doesMatch = false;
  812.     if ((cardType == "JCB") && (!isJCB(cardNumber)))
  813.         doesMatch = false;
  814.     if ((cardType == "DINERS") && (!isDinersClub(cardNumber)))
  815.         doesMatch = false;
  816.     if ((cardType == "CARTEBLANCHE") && (!isCarteBlanche(cardNumber)))
  817.         doesMatch = false;
  818.     if ((cardType == "ENROUTE") && (!isEnRoute(cardNumber)))
  819.         doesMatch = false;
  820.     return doesMatch;
  821. }